//
// Created by 14590 on 25-8-30.
//

#include "bsp_lcd.h"

/*****************************************************************************************
*	函 数 名: LCD_WriteCMD
*	入口参数: CMD - 需要写入的控制指令
*	返 回 值: 无
*	函数功能: 用于写入控制字
*	说    明: 无
******************************************************************************************/
void  LCD_WriteCommand(uint8_t lcd_command)
{

    while((LCD_SPI.Instance->SR & 0x0080) != RESET); 	// 先判断SPI是否空闲，等待通信完成

    LCD_DC_Command;	//	DC引脚输出低，代表写指令

    (&LCD_SPI)->Instance->DR = lcd_command;		// 发送数据
    while( (LCD_SPI.Instance->SR & 0x0002) == 0);		// 等待发送缓冲区清空
    while( (LCD_SPI.Instance->SR & 0x0080) != RESET);	//	等待通信完成

    LCD_DC_Data;	//	DC引脚输出高，代表写数据
}

/****************************************************************************************************************************************
*	函 数 名: LCD_WriteData_8bit
*
*	入口参数: lcd_data - 需要写入的数据，8位
*
*	函数功能: 写入8位数据
*
****************************************************************************************************************************************/
void  LCD_WriteData_8bit(uint8_t lcd_data)
{
    LCD_SPI.Instance->DR = lcd_data;									// 发送数据
    while( (LCD_SPI.Instance->SR & 0x0002) == 0);		// 等待发送缓冲区清空
}

/****************************************************************************************************************************************
*	函 数 名: LCD_WriteData_16bit
*
*	入口参数: lcd_data - 需要写入的数据，16位
*
*	函数功能: 写入16位数据
*
****************************************************************************************************************************************/
void  LCD_WriteData_16bit(uint16_t lcd_data)
{
    LCD_SPI.Instance->DR = lcd_data>>8;								// 发送数据，高8位
    while( (LCD_SPI.Instance->SR & 0x0002) == 0);		// 等待发送缓冲区清空
    LCD_SPI.Instance->DR = lcd_data;									// 发送数据，低8位
    while( (LCD_SPI.Instance->SR & 0x0002) == 0);		// 等待发送缓冲区清空
}

/****************************************************************************************************************************************
*	函 数 名: LCD_WriteBuff
*
*	入口参数: DataBuff - 数据区，DataSize - 数据长度
*
*	函数功能: 批量写入数据到屏幕
*
****************************************************************************************************************************************/
void  LCD_WriteBuff(uint16_t *DataBuff, uint16_t DataSize)
{
    uint32_t i;

    LCD_SPI.Instance->CR1 &= 0xFFBF;					// 关闭SPI
    LCD_SPI.Instance->CR1 |= 0x0800;	            // 切换成16位数据格式
    LCD_SPI.Instance->CR1 |= 0x0040;					// 使能SPI

    LCD_CS_L;	// 片选拉低，使能IC

    for(i=0;i<DataSize;i++)
    {

        LCD_SPI.Instance->DR = DataBuff[i];
        while( (LCD_SPI.Instance->SR & 0x0002) == 0);		// 等待发送缓冲区清空

    }
    while( (LCD_SPI.Instance->SR & 0x0080) != RESET);	//	等待通信完成
    LCD_CS_H;	// 片选拉高

    LCD_SPI.Instance->CR1 &= 0xFFBF;	// 关闭SPI
    LCD_SPI.Instance->CR1 &= 0xF7FF;	// 切换成8位数据格式
    LCD_SPI.Instance->CR1 |= 0x0040;	// 使能SPI
}